package com.wx.gof.pattern.behavioral.templatemethod;

/**
 * @ClassName AStudy
 * @Author wx
 * @Description 学习抽象类
 * @Date 2018-12-12-21:55
 */
public abstract class AStudy {

    /**
     * @param
     * @methodName: todayStudy
     * @author: wx
     * @description: 今日学习内容-模板方法
     * @date: 2018/12/12
     * @return: void
     */
    protected final void todayStudy() {
        // 父类组合固定模板
        studyData();
        studyContent();
        studyTime();
        if (isGame()) {
            game();
        }
    }

    /**
     * @param
     * @methodName: studyData
     * @author: wx
     * @description: 学习提前准备-固定行为
     * @date: 2018/12/12
     * @return: void
     */
    private final void studyData() {
        System.out.println("准备学习资料");
    }

    /**
     * @param
     * @methodName: game
     * @author: wx
     * @description: 玩游戏方法-可变行为
     * @date: 2018/12/12
     * @return: void
     */
    private final void game() {
        System.out.println("放松下,打两把游戏");
    }

    /**
     * @param
     * @methodName: isGame
     * @author: wx
     * @description: 是否玩游戏-可变行为(钩子方法配合玩游戏方法使用)
     * @date: 2018/12/12
     * @return: boolean
     */
    protected boolean isGame() {
        return false;
    }

    /**
     * @param
     * @methodName: studyContent
     * @author: wx
     * @description: 学习内容-可变行为
     * @date: 2018/12/12
     * @return: void
     */
    abstract void studyContent();

    /**
     * @param
     * @methodName: studyTime
     * @author: wx
     * @description: 学习时间-可变行为
     * @date: 2018/12/12
     * @return: void
     */
    abstract void studyTime();
}
